﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel;
using System.Web.Mvc;
using System.Web.Mvc.Html;

using Spring.Context;
using Spring.Context.Support;
using BOSS.Domain.Meta;

namespace BOSS.Web.Extensions
{
    /// <summary>
    /// HtmlHelper 的枚举值相关扩展
    /// </summary>
    public static class EnumValueExtensions
    {
        /// <summary>
        /// 枚举服务
        /// </summary>
        //private static IEnumValueService enumValueService;

        /// <summary>
        /// 静态构造函数
        /// </summary>
        static EnumValueExtensions()
        {
            //IApplicationContext appContext = ContextRegistry.GetContext();
            //enumValueService = appContext.GetObject("EnumValueService", typeof(IEnumValueService)) as IEnumValueService;
        }

        #region 未明确类型

        /// <summary>
        /// 在 ViewData 和 Model 中，根据 name 查找属性，并根据其类型和属性值绘制下拉框。
        /// 要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name)
        //{
        //    return EnumValueList(htmlHelper, name, (object)null);
        //}

        /// <summary>
        /// 在 ViewData 和 Model 中，根据 name 查找属性，并根据其类型和属性值绘制下拉框。
        /// 要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, string optionLabel)
        //{
        //    return EnumValueList(htmlHelper, name, (object)null, optionLabel);
        //}

        /// <summary>
        /// 在 ViewData 和 Model 中，根据 name 查找属性，并根据其类型和属性值绘制下拉框。
        /// 要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, string optionLabel, bool includeZero)
        //{
        //    return EnumValueList(htmlHelper, name, (object)null, optionLabel, includeZero);
        //}

        /// <summary>
        /// 在 ViewData 和 Model 中，根据 name 查找属性，并根据其类型和属性值绘制下拉框。
        /// 要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, string optionLabel, object htmlAttributes)
        //{
        //    return EnumValueList(htmlHelper, name, (object)null, optionLabel, htmlAttributes);
        //}

        /// <summary>
        /// 在 ViewData 和 Model 中，根据 name 查找属性，并根据其类型和属性值绘制下拉框。
        /// 要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, string optionLabel, bool includeZero, object htmlAttributes)
        //{
        //    return EnumValueList(htmlHelper, name, (object)null, optionLabel, includeZero, htmlAttributes);
        //}

        /// <summary>
        /// 若 value 为 null，则在 ViewData 和 Model 中根据 name 查找属性，并根据其类型和属性值绘制下拉框，此时要求属性必须存在
        /// 若 value 不为 null，则根据 value 的类型和取值绘制下拉框，此时 name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, object value)
        //{
        //    return EnumValueList(htmlHelper, name, value, null);
        //}

        /// <summary>
        /// 若 value 为 null，则在 ViewData 和 Model 中根据 name 查找属性，并根据其类型和属性值绘制下拉框，此时要求属性必须存在
        /// 若 value 不为 null，则根据 value 的类型和取值绘制下拉框，此时 name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, object value, string optionLabel)
        //{
        //    return EnumValueList(htmlHelper, name, value, optionLabel, null);
        //}

        /// <summary>
        /// 若 value 为 null，则在 ViewData 和 Model 中根据 name 查找属性，并根据其类型和属性值绘制下拉框，此时要求属性必须存在
        /// 若 value 不为 null，则根据 value 的类型和取值绘制下拉框，此时 name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, object value, string optionLabel, bool includeZero)
        //{
        //    return EnumValueList(htmlHelper, name, value, optionLabel, includeZero, null);
        //}

        /// <summary>
        /// 若 value 为 null，则在 ViewData 和 Model 中根据 name 查找属性，并根据其类型和属性值绘制下拉框，此时要求属性必须存在
        /// 若 value 不为 null，则根据 value 的类型和取值绘制下拉框，此时 name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, object value, string optionLabel, object htmlAttributes)
        //{
        //    return EnumValueList(htmlHelper, name, value, optionLabel, string.IsNullOrEmpty(optionLabel), htmlAttributes);
        //}

        /// <summary>
        /// 若 value 为 null，则在 ViewData 和 Model 中根据 name 查找属性，并根据其类型和属性值绘制下拉框，此时要求属性必须存在
        /// 若 value 不为 null，则根据 value 的类型和取值绘制下拉框，此时 name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, object value, string optionLabel, bool includeZero, object htmlAttributes)
        //{
        //    if (value == null)
        //    {
        //        // 动态查找属性
        //        object propertyValue = null;
        //        PropertyInfo propertyInfo = null;
        //        Type propertyType = ExtensionHelper.RetrieveProperty(htmlHelper, name, out propertyValue, out propertyInfo);

        //        if (propertyType == null)
        //        {
        //            // 未找到属性
        //            throw new InvalidOperationException(string.Format("未找到 {0} 所对应的属性", name));
        //        }
        //        else
        //        {
        //            if (propertyType == typeof(EnumValue) || propertyType == typeof(EnumValueCollection))
        //            {
        //                // 对于 NHibernate 所创建的动态包装类型，则使用其被包装的类型的属性
        //                if (propertyInfo.DeclaringType.Namespace == null)
        //                {
        //                    propertyInfo = propertyInfo.DeclaringType.BaseType.GetProperty(propertyInfo.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
        //                    if (propertyInfo == null)
        //                    {
        //                        throw new InvalidOperationException(string.Format("未找到 {0} 所对应的属性", name));
        //                    }
        //                }

        //                object[] attributes = propertyInfo.GetCustomAttributes(typeof(EnumCategoryAttribute), true);
        //                if (attributes.Length > 0)
        //                {
        //                    // 存在 EnumCategoryAttribute，则优先使用之
        //                    EnumCategoryAttribute attribute = attributes[0] as EnumCategoryAttribute;
        //                    Check.Assert(attribute != null);

        //                    EnumCategory enumCategory = enumValueService.FindCategoryByName(attribute.CategoryName);
        //                    if (enumCategory == null)
        //                    {
        //                        throw new InvalidOperationException(string.Format("EnumCategoryAttribute 中指定的枚举类型 {0} 不存在", attribute.CategoryName));
        //                    }

        //                    if (propertyType == typeof(EnumValue))
        //                    {
        //                        // EnumValue 类型
        //                        int enumValueId = (propertyValue == null) ? int.MinValue : (propertyValue as EnumValue).Id;
        //                        return CustomEnumValueList(htmlHelper, name, enumCategory, enumValueId, optionLabel, includeZero, htmlAttributes);
        //                    }
        //                    else
        //                    {
        //                        // EnumValueCollection 类型
        //                        return CustomEnumValueList(htmlHelper, name, enumCategory, propertyValue as EnumValueCollection, includeZero, htmlAttributes);
        //                    }
        //                }

        //                if (propertyType == typeof(EnumValue))
        //                {
        //                    EnumValue enumValue = propertyValue as EnumValue;
        //                    if (enumValue != null)
        //                    {
        //                        // 无 EnumCategoryAttribute，但是属性有值，则使用属性值中定义的类型
        //                        return CustomEnumValueList(htmlHelper, name, enumValue.Category, enumValue.Id, optionLabel, includeZero, htmlAttributes);
        //                    }
        //                }
        //                else
        //                {
        //                    EnumValueCollection enumValues = propertyValue as EnumValueCollection;
        //                    if (enumValues != null && enumValues.Category != null)
        //                    {
        //                        // 无 EnumCategoryAttribute，但是属性有值，且定义了 EnumCategory 属性，则使用属性值中定义的类型
        //                        return CustomEnumValueList(htmlHelper, name, enumValues.Category, enumValues, includeZero, htmlAttributes);
        //                    }
        //                }

        //                // 未定义 EnumCategoryAttribute
        //                throw new InvalidOperationException(string.Format("{0} 所对应的属性未定义 EnumCategoryAttribute", name));
        //            }

        //            int propertyIntValue = int.MinValue;
        //            if (propertyValue != null)
        //            {
        //                try
        //                {
        //                    propertyIntValue = Convert.ToInt32(propertyValue);
        //                }
        //                catch
        //                {
        //                }
        //            }

        //            if (propertyType.IsSubclassOf(typeof(Enum)))
        //            {
        //                // 普通枚举
        //                return StandardEnumValueList(htmlHelper, name, propertyType, propertyIntValue, optionLabel, includeZero, htmlAttributes);
        //            }

        //            if (propertyType.IsGenericType)
        //            {
        //                if (propertyType.GetGenericTypeDefinition().FullName == "System.Nullable`1")
        //                {
        //                    Type genericArgumentType = propertyType.GetGenericArguments()[0];
        //                    if (genericArgumentType.IsSubclassOf(typeof(Enum)))
        //                    {
        //                        // 普通枚举
        //                        return StandardEnumValueList(htmlHelper, name, genericArgumentType, propertyIntValue, optionLabel, includeZero, htmlAttributes);
        //                    }
        //                }
        //            }

        //            // 错误类型
        //            throw new InvalidOperationException(
        //                string.Format("{0} 所对应的属性类型应为 {1} 或普通的枚举类型，但当前为 {2}", name, typeof(EnumValue), propertyType));
        //        }
        //    }
        //    else
        //    {
        //        Type valueType = value.GetType();
        //        if (valueType.IsSubclassOf(typeof(Enum)))
        //        {
        //            // 普通枚举
        //            return StandardEnumValueList(htmlHelper, name, valueType, Convert.ToInt32(value), optionLabel, includeZero, htmlAttributes);
        //        }

        //        EnumValue enumValue = value as EnumValue;
        //        if (enumValue != null)
        //        {
        //            // EnumValue 类型
        //            return CustomEnumValueList(htmlHelper, name, enumValue.Category, enumValue.Id, optionLabel, includeZero, htmlAttributes);
        //        }

        //        if (valueType.IsGenericType)
        //        {
        //            if (valueType.GetGenericTypeDefinition().FullName == "System.Nullable`1")
        //            {
        //                Type genericArgumentType = valueType.GetGenericArguments()[0];
        //                if (genericArgumentType.IsSubclassOf(typeof(Enum)))
        //                {
        //                    // 普通枚举
        //                    return StandardEnumValueList(htmlHelper, name, genericArgumentType, Convert.ToInt32(value), optionLabel, includeZero, htmlAttributes);
        //                }
        //            }
        //        }

        //        // 错误类型
        //        throw new InvalidOperationException(
        //            string.Format("{0} 所对应的属性类型应为 {1} 或普通的枚举类型，但当前为 {2}", name, typeof(EnumValue), valueType));
        //    }
        //}

        #endregion

        #region 单选 - 普通枚举

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType)
        {
            return EnumValueList(htmlHelper, name, enumType, (string)null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, IEnumFilter filter)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, (string)null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, string optionLabel)
        {
            return EnumValueList(htmlHelper, name, enumType, optionLabel, (object)null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, IEnumFilter filter, string optionLabel)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, optionLabel, (object)null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, string optionLabel, bool includeZero)
        {
            return EnumValueList(htmlHelper, name, enumType, optionLabel, includeZero, (object)null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, IEnumFilter filter, string optionLabel, bool includeZero)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, optionLabel, includeZero, (object)null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, string optionLabel, object htmlAttributes)
        {
            return EnumValueList(htmlHelper, name, enumType, optionLabel, string.IsNullOrEmpty(optionLabel), htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, IEnumFilter filter, string optionLabel, object htmlAttributes)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, optionLabel, string.IsNullOrEmpty(optionLabel), htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, string optionLabel, bool includeZero, object htmlAttributes)
        {
            object propertyValue = null;
            PropertyInfo propertyInfo = null;
            Type propertyType = ExtensionHelper.RetrieveProperty(htmlHelper, name, out propertyValue, out propertyInfo);

            return EnumValueList(htmlHelper, name, enumType, propertyValue, optionLabel, includeZero, htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, IEnumFilter filter, string optionLabel, bool includeZero, object htmlAttributes)
        {
            object propertyValue = null;
            PropertyInfo propertyInfo = null;
            Type propertyType = ExtensionHelper.RetrieveProperty(htmlHelper, name, out propertyValue, out propertyInfo);

            return EnumValueList(htmlHelper, name, enumType, filter, propertyValue, optionLabel, includeZero, htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, object value)
        {
            return EnumValueList(htmlHelper, name, enumType, value, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, IEnumFilter filter, object value)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, value, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, object value, string optionLabel)
        {
            return EnumValueList(htmlHelper, name, enumType, value, optionLabel, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, IEnumFilter filter, object value, string optionLabel)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, value, optionLabel, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, object value, string optionLabel, bool includeZero)
        {
            return EnumValueList(htmlHelper, name, enumType, value, optionLabel, includeZero, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name,
            Type enumType, IEnumFilter filter, object value, string optionLabel, bool includeZero)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, value, optionLabel, includeZero, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name, Type enumType, object value, string optionLabel, object htmlAttributes)
        {
            return EnumValueList(htmlHelper, name, enumType, value, optionLabel, string.IsNullOrEmpty(optionLabel), htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name,
            Type enumType, IEnumFilter filter, object value, string optionLabel, object htmlAttributes)
        {
            return EnumValueList(htmlHelper, name, enumType, filter, value, optionLabel, string.IsNullOrEmpty(optionLabel), htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name,
            Type enumType, object value, string optionLabel, bool includeZero, object htmlAttributes)
        {
            return EnumValueList(htmlHelper, name, enumType, null, value, optionLabel, includeZero, htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueList(this HtmlHelper htmlHelper, string name,
            Type enumType, IEnumFilter filter, object value, string optionLabel, bool includeZero, object htmlAttributes)
        {
            int enumValue = int.MinValue;
            if (value != null)
            {
                if (value is string)
                {
                    string strValue = (string)value;
                    if (strValue.Length >= 0)
                    {
                        enumValue = Convert.ToInt32(strValue);
                    }
                }
                else
                {
                    enumValue = Convert.ToInt32(value);
                }
            }
            return StandardEnumValueList(htmlHelper, name, enumType, filter, enumValue, optionLabel, includeZero, htmlAttributes);
        }

        /// <summary>
        /// 生成普通枚举类型的枚举值列表
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="enumValue"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        private static string StandardEnumValueList(HtmlHelper htmlHelper, string name,
            Type enumType, int enumValue, string optionLabel, bool includeZero, object htmlAttributes)
        {
            return StandardEnumValueList(htmlHelper, name, enumType, null, enumValue, optionLabel, includeZero, htmlAttributes);
        }

        /// <summary>
        /// 生成普通枚举类型的枚举值列表
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="filter"></param>
        /// <param name="enumValue"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        private static string StandardEnumValueList(HtmlHelper htmlHelper, string name,
            Type enumType, IEnumFilter filter, int enumValue, string optionLabel, bool includeZero, object htmlAttributes)
        {
            IList<SelectListItem> items = new List<SelectListItem>();
            foreach (FieldInfo fieldInfo in enumType.GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                // 筛选
                if (filter != null)
                {
                    if (!filter.Test(fieldInfo))
                    {
                        continue;
                    }
                }

                object value = fieldInfo.GetValue(null);
                int intValue = Convert.ToInt32(value);

                if (!includeZero && intValue == 0)
                {
                    continue;
                }

                object[] attributes = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
                if (attributes.Length == 0)
                {
                    items.Add(new SelectListItem()
                    {
                        Value = intValue.ToString(),
                        Text = value.ToString(),
                        Selected = (enumValue == intValue),
                    });
                }
                else
                {
                    DescriptionAttribute description = attributes[0] as DescriptionAttribute;
                    items.Add(new SelectListItem()
                    {
                        Value = intValue.ToString(),
                        Text = description.Description,
                        Selected = (enumValue == intValue),
                    });
                }
            }

            object currentValue = htmlHelper.ViewData.Eval(name);
            htmlHelper.ViewData[name] = enumValue;
            string result = htmlHelper.DropDownList(name, items, optionLabel, htmlAttributes);
            htmlHelper.ViewData[name] = currentValue;
            return result;
        }

        /// <summary>
        /// 单选枚举
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <returns></returns>
        public static string EnumValueRadio(this HtmlHelper htmlHelper, string name, Type enumType)
        {
            return EnumValueRadio(htmlHelper, name, enumType, int.MinValue);
        }

        /// <summary>
        /// 单选枚举
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="enumValue"></param>
        /// <returns></returns>
        public static string EnumValueRadio(this HtmlHelper htmlHelper, string name, Type enumType, int enumValue)
        {
            return EnumValueRadio(htmlHelper, name, enumType, enumValue, true, null);
        }

        /// <summary>
        /// 单选枚举
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="enumValue"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueRadio(this HtmlHelper htmlHelper, string name, Type enumType, int enumValue, bool includeZero, IDictionary<string, object> htmlAttributes)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentException("自定义枚举的单选控件名字不能为空！", "name");
            }

            StringBuilder str = new StringBuilder("<span class=\"enumValueRaido\">");

            foreach (FieldInfo fieldInfo in enumType.GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                object value = fieldInfo.GetValue(null);
                int intValue = Convert.ToInt32(value);

                if (!includeZero && intValue == 0)
                {
                    continue;
                }

                TagBuilder tagBuilder = new TagBuilder("input");
                tagBuilder.MergeAttribute("type", "radio");
                tagBuilder.MergeAttribute("id", string.Format("{0}_{1}", name, intValue), true);
                tagBuilder.MergeAttribute("name", name, true);
                tagBuilder.MergeAttribute("value", intValue.ToString());

                if (htmlAttributes != null)
                {
                    tagBuilder.MergeAttributes<string, object>(htmlAttributes);
                }

                if (enumValue == intValue)
                {
                    tagBuilder.MergeAttribute("checked", "checked");
                }

                string tip = null;
                object[] attributes = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
                if (attributes.Length == 0)
                {
                    tip = value.ToString();
                    tagBuilder.SetInnerText(tip);
                }
                else
                {
                    DescriptionAttribute description = attributes[0] as DescriptionAttribute;
                    tagBuilder.SetInnerText(description.Description);
                    tip = description.Description;
                }

                str.AppendFormat("<label for=\"{0}\">{1}{2}</label> ", tagBuilder.Attributes["id"], tagBuilder.ToString(TagRenderMode.SelfClosing), tip);
            }

            return str.Append("</span>").ToString();
        }

        #endregion

        #region 单选 - 自定义枚举

        /// <summary>
        /// 根据 categoryName 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, (string)null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, string optionLabel)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, optionLabel, (object)null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, string optionLabel, bool includeZero)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, optionLabel, includeZero, (object)null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, string optionLabel, object htmlAttributes)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, optionLabel, string.IsNullOrEmpty(optionLabel), htmlAttributes);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name,
        //    EnumCategoryNames categoryName, string optionLabel, bool includeZero, object htmlAttributes)
        //{
        //    object propertyValue = null;
        //    PropertyInfo propertyInfo = null;
        //    Type propertyType = ExtensionHelper.RetrieveProperty(htmlHelper, name, out propertyValue, out propertyInfo);

        //    return EnumValueList(htmlHelper, name, categoryName, propertyValue, optionLabel, includeZero, htmlAttributes);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, value, null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value, string optionLabel)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, value, optionLabel, null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value, string optionLabel, bool includeZero)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, value, optionLabel, includeZero, null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value, string optionLabel, object htmlAttributes)
        //{
        //    return EnumValueList(htmlHelper, name, categoryName, value, optionLabel, string.IsNullOrEmpty(optionLabel), htmlAttributes);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueList(this HtmlHelper htmlHelper, string name,
        //    EnumCategoryNames categoryName, object value, string optionLabel, bool includeZero, object htmlAttributes)
        //{
        //    EnumCategory enumCategory = enumValueService.FindCategoryByName(categoryName.ToString());
        //    if (enumCategory == null)
        //    {
        //        throw new InvalidOperationException(string.Format("EnumCategoryAttribute 中指定的枚举类型 {0} 不存在", categoryName));
        //    }

        //    int enumValueId = int.MinValue;
        //    if (value != null)
        //    {
        //        EnumValue enumValue = value as EnumValue;
        //        if (enumValue != null)
        //        {
        //            enumValueId = enumValue.Id;
        //        }
        //        else if (value is string)
        //        {
        //            string strValue = (string)value;
        //            if (strValue.Length >= 0)
        //            {
        //                enumValueId = Convert.ToInt32(strValue);
        //            }
        //        }
        //        else if (value is IConvertible)
        //        {
        //            enumValueId = Convert.ToInt32(value);
        //        }
        //        else if (value is EnumValueCollection)
        //        {
        //            // 忽略 optionLabel
        //            return CustomEnumValueList(htmlHelper, name, enumCategory, value as EnumValueCollection, includeZero, htmlAttributes);
        //        }
        //    }
        //    return CustomEnumValueList(htmlHelper, name, enumCategory, enumValueId, optionLabel, includeZero, htmlAttributes);
        //}

        /// <summary>
        /// 生成自定义枚举值列表
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumCategory"></param>
        /// <param name="enumValueId"></param>
        /// <param name="optionLabel"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //private static string CustomEnumValueList(HtmlHelper htmlHelper, string name,
        //    EnumCategory enumCategory, int enumValueId, string optionLabel, bool includeZero, object htmlAttributes)
        //{
        //    IList<SelectListItem> items = new List<SelectListItem>();
        //    foreach (EnumValue value in enumCategory.Values)
        //    {
        //        if ((!includeZero) && (value.Value == 0))
        //        {
        //            continue;
        //        }
        //        items.Add(new SelectListItem()
        //        {
        //            Value = value.Id.ToString(),
        //            Text = value.Text,
        //            Selected = (enumValueId == value.Id),
        //        });
        //    }

        //    object currentValue = htmlHelper.ViewData.Eval(name);
        //    htmlHelper.ViewData[name] = enumValueId;
        //    string result = htmlHelper.DropDownList(name, items, optionLabel, htmlAttributes);
        //    htmlHelper.ViewData[name] = currentValue;
        //    return result;
        //}

        #endregion

        #region 多选 - 普通枚举

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <returns></returns>
        public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, Type enumType)
        {
            return EnumValueMultiList(htmlHelper, name, enumType, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="enumValue"></param>
        /// <returns></returns>
        public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, Type enumType, object enumValue)
        {
            return EnumValueMultiList(htmlHelper, name, enumType, enumValue, false, null);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="enumValue"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, Type enumType, object enumValue, bool includeZero, object htmlAttributes)
        {
            return EnumValueMultiList(htmlHelper, name, enumType, null, enumValue, includeZero, htmlAttributes);
        }

        /// <summary>
        /// 根据 enumType 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumType"></param>
        /// <param name="exclude"></param>
        /// <param name="enumValue"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, Type enumType, ICollection<int> exclude, object enumValue, bool includeZero, object htmlAttributes)
        {
            int v = enumValue == null ? int.MinValue : (int)enumValue;

            IList<int> ids = new List<int>();
            IList<string> texts = new List<string>();

            IList<SelectListItem> items = new List<SelectListItem>();
            foreach (FieldInfo fieldInfo in enumType.GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                object value = fieldInfo.GetValue(null);
                int intValue = Convert.ToInt32(value);

                if ((!includeZero) && (intValue == 0))
                {
                    continue;
                }

                if (exclude != null && exclude.Contains(intValue))
                {
                    continue;
                }

                bool selected = (v & intValue) == intValue;
                string text = value.ToString();
                items.Add(new SelectListItem()
                {
                    Value = intValue.ToString(),
                    Text = text,
                    Selected = selected,
                });

                if (selected)
                {
                    ids.Add(intValue);
                    texts.Add(value.ToString());
                }
            }

            ModelState state;
            if (!htmlHelper.ViewData.ModelState.TryGetValue(name, out state))
            {
                state = new ModelState()
                {
                    Value = new ValueProviderResult(ids.ToArray(), string.Join(",", texts.ToArray()), null),
                };
                htmlHelper.ViewData.ModelState.Add(name, state);
            }
            else if (state.Value == null)
            {
                state.Value = new ValueProviderResult(string.Empty, string.Empty, null);
            }

            string result = htmlHelper.ListBox(name, items, htmlAttributes);
            return result;
        }

        #endregion

        #region 多选 - 自定义枚举

        /// <summary>
        /// 根据 categoryName 的指示绘制下拉框；在 ViewData 和 Model 中根据 name 查找属性，并将该属性值作为下拉框的默认值。
        /// 不要求属性必须存在
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <returns></returns>
        //public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName)
        //{
        //    return EnumValueMultiList(htmlHelper, name, categoryName, false, null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        //public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value)
        //{
        //    return EnumValueMultiList(htmlHelper, name, categoryName, value, false, null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <param name="includeZero"></param>
        /// <returns></returns>
        //public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value, bool includeZero)
        //{
        //    return EnumValueMultiList(htmlHelper, name, categoryName, value, includeZero, null);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value, object htmlAttributes)
        //{
        //    return EnumValueMultiList(htmlHelper, name, categoryName, value, false, htmlAttributes);
        //}

        /// <summary>
        /// 根据 categoryName 的指示绘制以 value 为默认值的下拉框。
        /// name 只用于控件标识及名称
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="categoryName"></param>
        /// <param name="value"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //public static string EnumValueMultiList(this HtmlHelper htmlHelper, string name, EnumCategoryNames categoryName, object value, bool includeZero, object htmlAttributes)
        //{
        //    EnumCategory enumCategory = enumValueService.FindCategoryByName(categoryName.ToString());
        //    if (enumCategory == null)
        //    {
        //        throw new InvalidOperationException(string.Format("EnumCategoryAttribute 中指定的枚举类型 {0} 不存在", categoryName));
        //    }

        //    return CustomEnumValueList(htmlHelper, name, enumCategory, value as EnumValueCollection, includeZero, htmlAttributes);
        //}

        /// <summary>
        /// 生成自定义枚举值列表
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="name"></param>
        /// <param name="enumCategory"></param>
        /// <param name="enumValues"></param>
        /// <param name="includeZero"></param>
        /// <param name="htmlAttributes"></param>
        /// <returns></returns>
        //private static string CustomEnumValueList(HtmlHelper htmlHelper, string name,
        //    EnumCategory enumCategory, EnumValueCollection enumValues, bool includeZero, object htmlAttributes)
        //{
        //    IList<SelectListItem> items = new List<SelectListItem>();
        //    foreach (EnumValue value in enumCategory.Values)
        //    {
        //        if ((!includeZero) && (value.Value == 0))
        //        {
        //            continue;
        //        }
        //        items.Add(new SelectListItem()
        //        {
        //            Value = value.Id.ToString(),
        //            Text = value.Text,
        //            Selected = (enumValues != null && enumValues.Contains(value)),
        //        });
        //    }

        //    ModelState state;
        //    if (!htmlHelper.ViewData.ModelState.TryGetValue(name, out state))
        //    {
        //        state = new ModelState()
        //        {
        //            Value = (enumValues == null)
        //                ? new ValueProviderResult(string.Empty, string.Empty, null)
        //                : new ValueProviderResult(enumValues.Ids.ToArray(), enumValues.TextValue, null),
        //        };
        //        htmlHelper.ViewData.ModelState.Add(name, state);
        //    }
        //    else if (state.Value == null)
        //    {
        //        state.Value = new ValueProviderResult(string.Empty, string.Empty, null);
        //    }

        //    string result = htmlHelper.ListBox(name, items, htmlAttributes);
        //    return result;
        //}

        #endregion
    }
}
